package com.jdk.learn.juc._02cas;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by bgt on 2018/1/30.
 *
 *  volidate 不保证原子性
 *
 *  可以使用原子变量替代
 *  jdk1.5后提供了原子操作类
 *  java.util.concurrent.atomic下
 *      volidate保持内存可见性
 *      cas算法保证原子性
 *      compare and swap
 *      包含三个操作数
 *      内存值 v
 *      预估值 A
 *      更新值 B
 *      当且仅当 v==a时，更新v=b 其他的失败
 */
public class TestAtom {
    public static void main(String[] args) {
        ThreadDemo td=new ThreadDemo();

        for (int i = 0; i <10 ; i++) {
            new Thread(td).start();
        }
    }
}

/**
 * 测试发现在jdk9下是无法复现问题
 * 但是jdk8中是可以发现原子性问题

 :0:1:2:2:3:4:5:6:8:7

 */
class ThreadDemo implements Runnable {

    private  int num=0;
    //解决方案
    private AtomicInteger num1;
    @Override
    public void run() {
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.print(":"+getNum());
    }

    public int getNum() {
        return num++;
//        return num1.getAndIncrement();
    }
}